﻿#ifndef SISTEMA_H
#define SISTEMA_H

#include "ISistema.h"
#include "ICiudad.h"
#include "IExcursion.h"
#include "Ciudad.h"
#include "IAtraccion.h"
#include "AVL.h"
#include "GrafoCiudad.h"
#include "ITabla.h"
#include "Matriz.h"
#include "ColaPrioridad.h"
#include "Excursion.h"

class Sistema : public ISistema
{
public:
	Sistema(nat VELOCIDAD_OMNIBUS, nat VELOCIDAD_AVION, nat COSTO_OMNIBUS, nat COSTO_AVION, nat CAPACIDAD_OMNIBUS, nat CAPACIDAD_AVION, nat MAX_CIUDADES, nat MAX_EXCURSIONES);
	virtual ~Sistema();

	// Hito de Control Tipo 1
	TipoRetorno IngresoCiudad(Cadena nombre);
	TipoRetorno IngresoAtraccion(Cadena identificador, Cadena nombre, nat horarioInicio, nat horarioFin, Cadena nombreCiudad, nat precio);
	TipoRetorno CalificarAtraccion(nat fechaCalificacion, Cadena idAtraccion, int calificacion, Cadena comentarios);
	TipoRetorno AltaConexion(Cadena ciudadOrigen, Cadena ciudadDestino, nat distancia, nat omnibus, nat aviones);
	Tupla<TipoRetorno, pAtraccion> ConsultaAtraccion(Cadena idAtraccion);
	Tupla<TipoRetorno, Iterador<Tupla<Cadena, Cadena, TipoTransporte, nat>>> Transportes();

	// Entrega final Tipo 1
	Tupla<TipoRetorno, pCiudad> CiudadMejoresAtracciones();
	TipoRetorno IngresoExcursionItinerario(nat nroExcursion, nat fecha, Iterador<Cadena> itinerario);
	TipoRetorno IngresoExcursionDistancia(nat nroExcursion, nat fecha, nat tiempoMax, Cadena ciudadOrigen, Cadena ciudadDestino, Iterador<Cadena> ciudadesNoDeseadas);
	TipoRetorno IngresoExcursionCosto(nat nroExcursion, nat fecha, Cadena ciudadOrigen, Cadena ciudadDestino);
	Tupla<TipoRetorno, pExcursion> ConsultaExcursion(nat nroExcursion);
	Tupla<TipoRetorno, Iterador<pCiudad>> ListadoCiudades();

	// Entrega final Tipo 2
	Tupla<TipoRetorno, bool> HayCamino(Cadena ciudadOrigen, Cadena ciudadDestino);
	Tupla<TipoRetorno, Iterador<pAtraccion>> AtraccionesAVisitarA(nat nroExcursion, nat dineroMax);
	Tupla<TipoRetorno, Iterador<pAtraccion>> AtraccionesAVisitarB(nat nroExcursion, nat dineroMax);
	Tupla<TipoRetorno, nat> MaximosViajantes(Cadena ciudadOrigen, Cadena ciudadDestino);

	// Operaciones opcionales
	Tupla<TipoRetorno, Iterador<pCiudad>> CiudadesEsenciales(Cadena ciudadOrigen, Cadena ciudadDestino, TipoTransporte tipoTransporte);


private:

	nat maxCiudades;
	nat maxExcursiones;
	
	nat cantCiudades;
	nat cantExcursiones;
	
	nat costoOmnibus;
	nat costoAvion;

	nat velocidadOmnibus;
	nat velocidadAvion;

	nat capacidadOmnibus;
	nat capacidadAvion;

	Puntero<IArbol<Puntero<ICiudad>>> avlCiudades;
	
	Puntero<GrafoCiudad> grafoCiudad;
	Puntero<ITabla<Cadena,Puntero<ICiudad>>> tablaCiudades;
	
	Puntero<ITabla<nat,Puntero<IExcursion>>> tablaExcursion;
	
	Matriz<Puntero<IAtraccion>> matrizAtraccion;
	
	Tupla<nat, nat> ObtenerPosiciones(Cadena identificador);

	Puntero<ColaPrioridad<Puntero<Ciudad>>> heapCiudades;

	//Puntero<ITabla<nat,Puntero<IExcursion>>> tablaExcursiones;

	//Init NULL matriz de atracciones
	void initMatrizAtraccion()
	{
		for(int i=0;i<26;i++)
		{
			for(int j=0;j<100;j++)
			{
				this->matrizAtraccion[i][j] = NULL;
			}
		}
	}

	
};

#endif
